#include<stdio.h>
#include<signal.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>

volatile int quit = 0;

void handler(int signo)
{
    printf("%d 号信号, 正在被捕捉!\n",signo);
    printf("quit: %d",quit);
    quit = 1;
    printf("-> %d\n",quit);
}

void test()
{
    signal(2,handler);
    while(!quit);
    printf("注意, 我是正常退出的!\n");
}

void handler1(int signo)
{
    printf("pid: %d,%d 号信号, 正在被捕捉!\n",getpid(),signo);
    //这里用wait操作的话,代码健壮性不好, 假如我有非常多的子进程, 在同一时刻退出了,就都会给父进程发信号, 存在信号屏蔽的问题, 会有遗漏
}

void Count(int cnt)
{
    while(cnt)
    {
        printf("cnt: %2d\r",cnt);
        fflush(stdout);
        cnt--;
        sleep(1);
    }
    printf("\n");
}

void test1()
{
    signal(SIGCHLD,handler1);
    printf("我是父进程, %d,ppid: %d\n",getpid(),getppid());
    pid_t id = fork();
    if(id == 0)
    {
        printf("我是子进程, %d, ppid: %d, 我要退出啦\n",getpid(),getppid());
        Count(5);
        exit(1);
    }
    while(1) sleep(1);
}

void test2()
{
    //显示的设置对SIGCHLD进行忽略
    signal(SIGCHLD,SIG_IGN);
    printf("我是父进程, %d,ppid: %d\n",getpid(),getppid());
    pid_t id = fork();
    if(id == 0)
    {
        printf("我是子进程, %d, ppid: %d, 我要退出啦\n",getpid(),getppid());
        Count(5);
        exit(1);
    }
    while(1) sleep(1);
}
int main()
{
    //test();
    //test1();
    test2();
    return 0;
}